06 GPIO
06 GPIO原理General Purpose Input/Output 通用输入输出端口
1 ⭐️GPIO简介

GPIO(General Purpose Input Output)通用I/O端口, 是STM32芯片与外部设备的电气接口
-
STM32F103C8T6只有 3 组 GPIO:GPIOA、GPIOB、GPIOC
-
每组标准 16 个引脚(编号 0~15,标注 PAx/PBx/PCx)
-
但C8T6 是小容量封装,部分引脚未引出.
-
输入
- Input floating 浮空
- Input pull-up 上拉
- Input-pull-down 下拉
- Analog 模拟输入
-
输出
- Output push-pull 推挽
- Output open-drain 开漏
- Alternate function push-pull 复用推挽
- Alternate function open-drain 复用开漏
-
输出速度(3档)
- 低速 2MHz
- 中速 10MHz
- 高速 50MHz
-
输入
输入很显然由外部决定,这里配置的意义在于给一个初始电压,从而确定IO口的初始状态
2 ➡️GPIO四种输入
2.1 输入结构
保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入
上拉、下拉电阻:开启上拉的时候引脚初始状态为高电平,开启下拉的时候引脚初始状态为低电平
TTL施密特触发器:IO口信号经过触发器后,模拟信号转化为0和1的数字信号
IDR Input data register(输入数据寄存器):锁存引脚的实时电平状态, 供 CPU 读取
配置寄存器用不同位组合选择模式。使用时先回答“外部接了什么、空闲时应该是什么状态”,再决定输入方式,比直接记选项更容易。
2.2 浮空输入
- 浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器
- MCU直接读取I/O口电平,I/O的初始电平状态是不确定的,完全由外部输入决定
2.3 上拉输入
- IO内部接上拉电阻 此时IO口默认为高电平
2.4 下拉输入
- IO内部接下拉电阻 此时IO口默认为低电平
STM32的内部上拉是"弱上拉",因为有上/下拉电阻的存在,通过此上/下拉输出的电流是很弱的,所以有外部输入是, 电平由外部决定
2.5 模拟输入
-
模拟输入模式下,外部电平信号没有流入输入数据寄存器,而是直接流入模拟输入部分
-
当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块
-
当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出
-
除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式
3 ⬅️GPIO四种输出
3.1 输出结构
P-MOS管和N-MOS管:通过P-MOS管和N-MOS管的互补配合 实现IO口输出高低电平
-
ODR- Output data register (输出数据寄存器):存储 CPU 要输出的目标电平状态 -
BSRR/BRR- Bit set/reset registers ( 置位 / 复位寄存器):原子操作置位 / 复位引脚, 避免多任务冲突
剩下三个在GPIO的框架图里面没有标注出来
-
GPIOx_CRL- Port configuration register Low(端口配置低寄存器): 用于配置低八位引脚的模式(PIN0到PIN7引脚) -
GPIOx_CRH- Port configuration register High (端口配置高寄存器) 该寄存器配置信息和上面的一样, 用于配置高八位引脚(PIN8到PIN15)
-
该寄存器使用了32位, 每个引脚对应4位去配置, 所以一个寄存器对应8个引脚
-
四位中, 低两位叫
MODE, 高两位叫CNF -
低两位MODE的信息分别控制引脚的输入输出方向, 和输出速度
-
高两位CNF的信息分别控制 输入/输出方向下的 四种模式
3.2 推挽输出
-
推挽模式下,
P-MOS和N-MOS都受输出控制逻辑驱动 -
如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平
-
若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平
-
此时施密特触发器是打开的,即输入可用
3.3 开漏输出
开漏模式下, P-MOS始终断开, 只有 N-MOS 工作
-
如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平
-
若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,即释放端口
-
并且此时施密特触发器是打开的,即输入可用
- MOS 管有栅极 (基极)、漏极 (集电极)、源极 (发射极)
- 开漏 = 漏极对外开路(只接内部 N-MOS 管漏极,不接上拉电源)
3.4 复用推挽输出
其信号来源是由复用功能相关的通信通道来控制 下的推挽输出
3.5 复用开漏输出
控制信号的来源由复用功能的外设决定的开漏输出
开漏输出比推挽输出少用了一个 P-MOS, 它的意义在于
-
开漏输出只可输出低电平,要得到高电平状态需要外接上拉电阻才行
-
开漏输出一般应用在I2C等需要“线与”功能的总线电路中。
-
除此之外,还用在电平不匹配的场合,如需要输出5伏的高电平,就可以在外部接一个上拉电阻,上拉电源为5伏